/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package br.edu.fatec.ads.bo;

import br.edu.fatec.ads.classes.Livro;
import br.edu.fatec.ads.dao.HibernateGenericDAO;
import br.edu.fatec.ads.util.CriteriosUtil;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.hibernate.HibernateException;
import org.hibernate.criterion.Criterion;

/**
 *
 * @author Ubirajara
 */
public class BusinessObjectLivro implements IBusinessObject{

    private HibernateGenericDAO dao = null;

    public BusinessObjectLivro() {
        dao = new HibernateGenericDAO(Livro.class);
    }
    public void beginTransaction() {
        dao.beginTransaction();
    }

    public void commitTransaction() {
        dao.commitTransaction();
    }

    public void rollbackTransaction() {
        dao.rollbackTransaction();
    }

    public boolean hasQtdeMinimaISBN(Livro livro){
        return (livro.getIsbn().length() > 9 && livro.getIsbn().length() < 14);
    }

    public void inserir(Livro livro){
        dao.save(livro);
    }

    public List<Livro> recuperarLivrosPorCriterio(Livro livro)
        throws HibernateException{
        List<Livro> livrosRecuperados = Collections.EMPTY_LIST;

        Map<String, Object> criteriosConsulta = new HashMap<String, Object>();
        Map<String, Object> camposValores = new HashMap<String, Object>();

        if(livro.getCodigo() > 0){
            camposValores.put("codigo", livro.getCodigo());
        }

        if(livro.getTitulo() != null && !livro.getTitulo().isEmpty()){
            Map<String, Object> criteriosLike = new HashMap<String, Object>();

            criteriosLike.put("titulo", livro.getTitulo());
            criteriosConsulta.put(CriteriosUtil.CRITERIOS_LIKE, criteriosLike);
        }

        if(!criteriosConsulta.isEmpty() || !camposValores.isEmpty()){
            criteriosConsulta.put(CriteriosUtil.CRITERIOS_OBJETO, camposValores);

            List<Criterion> criteriosConvertidos = CriteriosUtil
                                                    .getInstance()
                                                        .montaCriterios(criteriosConsulta);

            livrosRecuperados = dao.findByCriterion(criteriosConvertidos);
        }

        return livrosRecuperados;
    }

    public List<Livro> recuperarLivrosPorAutor(Livro livro){
        return null;
    }

    public Livro getLivro(int codigoTombo)
        throws HibernateException{

        return (Livro) dao.get(codigoTombo);
    }

    public void excluir(Livro livro)
        throws HibernateException{

        try{
            dao.delete(livro);

        }catch(HibernateException cause){
            cause.printStackTrace();

            throw new HibernateException("Problemas ao excluir o livro! Tente novamente");
        }
    }

    public void clearSession(){
        dao.clearSession();
    }

    public void updateLivro(Livro livro)
        throws HibernateException{

        try{
            dao.update(livro);
        }catch(HibernateException cause){
            throw new HibernateException("Problemas ao atualizar os dados do Livro! Tente novamente");
        }
    }

}